博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django进阶-Forms模块实例
阅读量:6838 次
发布时间:2019-06-26

本文共 9813 字,大约阅读时间需要 32 分钟。

hot3.png

form验证实例

创建项目

django-admin startproject Mydjangocd Mydjangopython manage.py startapp APP

项目架构

[其它保持默认的忽略未显示]

Mydjango    APP        migrations            0001_initial.py            __init__.py        static            __init__.py            jquery-3.3.1.min.js        templates            add_user.html            edit_user.html            user.html        admin.py        apps.py        models.py        views.py    Mydjango        settings.py        urls.py    db.sqlite3

add_user.html

    
this from login

这是添加用户的页面

{% csrf_token %}

{

{ data_obj.user.label }}:{
{ data_obj.user }}{
{ data_obj.user.errors.0 }}

{

{ data_obj.pwd.label }}:{
{ data_obj.pwd }}{
{ data_obj.pwd.errors.0 }}

{

{ data_obj.gen.label }}:{
{ data_obj.gen }}

{

{ data_obj.area.label }}:{
{ data_obj.area }}

{

{ data_obj.age.label }}:{
{ data_obj.age }}{
{ data_obj.age.errors.0 }}

{

{ data_obj.email.label }}:{
{ data_obj.email }}{
{ data_obj.email.errors.0 }}

{

{ data_obj.img.label }}{
{ data_obj.img }}{
{ data_obj.img.errors.0 }}

整体错误信息提示:{
{ data_obj.non_field_errors }}

edit_user.html

    
this from login

这是编辑中的页面

{% csrf_token %}
{
{ data_obj.as_p }}

users.html

    
this is user list
{% csrf_token %}
{% for row in user_list %}
{% if row.gen == True %}
{% else %}
{% endif %} {% if row.area == "0" %}
{% elif row.area == "1" %}
{% elif row.area == "2" %}
{% elif row.area == "3" %}
{% else %}
{% endif %}
{% endfor %}
序列号 用户名 密码 性别 地区 年龄 邮箱 操作
{
{ row.id }}
{
{ row.user }}
{
{ row.pwd }}
华南 华北 华中 华东 华西 {
{ row.age }}
{
{ row.email }}
编辑|删除

models.py

# -*- coding:utf8 -*-from django.db import modelsclass User_tab(models.Model):                 #创建用户表    user = models.CharField(max_length=18,)          #用户字段    pwd = models.CharField(max_length=32,)           #密码字段    gen = models.BooleanField()                      #性别字段    area = models.CharField(max_length=18,)          #地区字段    age = models.IntegerField()                      #年龄字段    email = models.EmailField()                      #邮箱字段

views.py

# -*- coding:utf8 -*-from django.shortcuts import render,redirect,HttpResponsefrom APP import modelsfrom django import formsfrom django.forms import fields,widgetsfrom django.core.exceptions import ValidationErrorclass From_check(forms.Form):              #继承forms模块    #利用froms模块进行数据验证,变量名和前端name属性保持一致# start ---------------------------------  forms模块数据验证  ------------------------------    #            【注意,验证字段为了写入数据库方便,需要和数据库中数据字段保持一致!】    # 限制类型-字符串最大长度最小长度,且不能为空    user = fields.CharField(        label="用户",        max_length=18,        min_length=2,        required=True,        error_messages={            'required':'用户名不能为空',            'max_length':'用户名不能超过18个字符',            'min_length':'用户名不能小于2个字符',        }    )    # 限制类型-字符串最小长度为8,且不能为空    pwd = fields.CharField(        label="密码",        max_length=32,        min_length=8,        required=True,        error_messages = {        'required': '密码不能为空',        'max_length': '密码不能超过32个字符',        'min_length': '密码不能小于8个字符',        }    )    gen = fields.ChoiceField(        label="性别",        choices=((0,'男'),(1,'女'),),        initial=0,        widget=widgets.RadioSelect,        error_messages={            'required': '性别是必选项'        }                 )    area = fields.ChoiceField(        label="地区",        choices=[(0,'华南'),(1,'华北'),(2,'华中'),(3,'华东'),(4,'华西')],        #如果从数据库中获取choices必须是列表格式,示例写法:【也可以使用ModelChoiceField方式从数据库获取】        #models.User_tab.objects.objects.values_list('id','username')        initial=2,        error_messages={            'required':''        }    )    #配合从数据库调取数据实时更新展现前端页面用法    #  def __init__(self, *args,**kwargs):    #      super(From_check, self).__init__(*args,**kwargs)   #拷贝所有静态属性赋值给fields    #      self.fields['area'].widget.choices=models.User_tab.objects.objects.values_list('id','username')    # 限制类型-整型,且不能为空    age = fields.IntegerField(        label="年龄",        max_value=60,        min_value=18,        required=True,        error_messages={            'required': '年龄不能为空',            'max_value':'老爷爷不要玩儿网络啦~',            'min_value':'未成年不能玩儿网络!!!',            'invalid':'年龄格式有问题,必须为数字',        }    )    # 限制类型-邮箱,且不能为空    email = fields.EmailField(        label="邮箱",        required=True,        error_messages={            'required': '邮箱不能为空',            'invalid': '邮箱格式有问题',        }    )    def clean(self):  # Django预留扩展验证函数        value_dict = self.cleaned_data  # 其他验证通过的数据        v1 = value_dict.get('user')  # 拿到验证通过的 username 字段数据,用于再次验证        v2 = value_dict.get('email')  # 拿到验证通过的 email 字段数据,用于再次验证        print("验证通过的用户名是:", v1, "邮箱是", v2)        d1 = models.User_tab.objects.filter(user=v1).count()  # 获取数据库中用户名出现次数        d2 = models.User_tab.objects.filter(email=v2).count()  # 获取数据库中邮箱出现次数        print("数据库获取v1是否存在", d1, "数据库获取v2是否存在", d2)        if d1 != 0 or d2 != 0:  # 判断用户名和邮箱在数据库中是否存在            raise ValidationError('此用户或邮箱已经被占用!')        return self.cleaned_data# end ---------------------------------  forms模块数据验证  ------------------------------def Data_sub(request):    if request.method == "GET":        data_obj = From_check()                                        #经过验证,包含未验证通过的错误信息        return render(request, "add_user.html", {"data_obj": data_obj})    else:        data_obj = From_check(request.POST,request.FILES)               #拿到from获取到的所有数据(post数据和file数据)        if data_obj.is_valid():                                         #判断是否验证成功            print("验证成功:",data_obj.cleaned_data)                   #已经验证成功后用户的正确数据【字典形式】            models.User_tab.objects.create(**data_obj.cleaned_data)     #验证通过的数据写入数据库【使用**数据可避免单个字段写入】            return redirect("/users.html")        else:            print("验证错误:",data_obj.errors)                         #验证失败返回的错误信息            return render(request,"add_user.html",{"data_obj":data_obj}) #将验证数据传输到前端页面,便于取验证通过的数据和错误反馈信息def Query_users(request):    user_list = models.User_tab.objects.all()    return render(request, "users.html",{'user_list':user_list,})def Edit_user(request,nid):    if request.method == "GET":        data = models.User_tab.objects.filter(id=nid).first()               #数据库中查询该ID所有字段        print("编辑字段",data)        data_obj = From_check({'user':data.user,'pwd':data.pwd,'age':data.age,'email':data.email,})      #拿到需要编辑的对象        return render(request,"edit_user.html",locals())                #传送前端页面可利用from组件模块生成html    else:        print("获取编辑后的数据:",request.POST.get,nid)        data_obj = From_check(request.POST)        if data_obj.is_valid():                                         #判断是否验证成功            print("验证成功:",data_obj.cleaned_data)                   #已经验证成功后用户的正确数据【字典形式】            models.User_tab.objects.filter(id=nid).update(**data_obj.cleaned_data)     #验证通过的数据写入数据库【使用**数据可避免单个字段写入】            return redirect("/users.html")        else:            print("验证错误:",data_obj.errors)                         #验证失败返回的错误信息            return render(request,"edit_user.html",locals()) #将验证数据传输到前端页面,便于取验证通过的数据和错误反馈信息def Del_user(request):    nid = request.GET .get('nid')    print("删除ID是:",nid)    models.User_tab.objects.filter(id=nid).delete()    return HttpResponse("删除成功!!!")

settings.py

INSTALLED_APPS

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'APP',]

TEMPLATES

TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [os.path.join(BASE_DIR, 'APP/templates')],        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]

STATIC_URL

STATIC_URL = '/static/'

urls.py

# -*- coding:utf8 -*-from django.contrib import adminfrom django.urls import path,re_pathfrom APP import viewsurlpatterns = [    path('admin/', admin.site.urls),    re_path('^add_user.html$',views.Data_sub),    re_path('^users.html$',views.Query_users),    re_path('^edit_user-(\d+).html$',views.Edit_user),   #获取编辑的用户id    re_path('^del_user.html$',views.Del_user),]

生成数据表测试

生成数据表

python manage.py makemigrations APPpython manage.py migrate

运行项目

python manage.py runserver

转载于:https://my.oschina.net/zhaojunhui/blog/2962858

你可能感兴趣的文章